<?php

namespace App\Http\Controllers\home;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;
use Hash;
use DB;
use Mail;
/**
*   前台注册控制器
*   对用户注册进行邮件处理 手机验证
*/
class RegisterController extends Controller
{
   /**
   *    前台注册页面
   */
   public function getIndex(){
        return view('home.register.index');
   }
   /**
   *    前台邮箱注册执行
   */
   public function postInsertemail(Request $request){
      // 将验证码信息压入request
      // $request -> input('verifyCode',session('code'));
      //注册信息验证
      $this -> validate($request,
          [
            'username' => 'required',
            'password' => 'required',
            'passwordRepeat' => 'required|same:password',
            // 'code' => 'required|same:verifyCode'
         
          ],
          [
            'username.required' => '账号不能为空',
            'password.required' => '密码不能为空',
            'passwordRepeat.required' => '确认密码不能为空',
            'passwordRepeat.same' => '两次密码输入一致',
            'code.required' => '请输入验证码',
            // 'code.same' => '验证码输入错误'
           
          ]);

      if($request -> input('code') != session('code')){
        session(['codeerror' => '两次输入的验证码不一样']);
        return back();
      }
      // 验证码验证成功 删除session
      session() -> forget('codeerror');
       
      // 注册信息生成
      $data['username'] = $request -> input('username');
      $data['password'] = Hash::make($request -> input('password'));
      $data['ctime'] = time();
      $data['token'] = str_random(50);//账号激活用的随机字符
      $data['status'] = 1;

      // 将数据插入数据库并获取刚插入数据的id-〉邮箱激活使用
      $newUserId = DB::table('user') -> insertGetId($data); 

      // 如果 newUserId 拿到参数 给用户发送邮件 让用户激活帐号
      if ($newUserId > 0) {
        self::sendemail($data,$newUserId);//给用户发送激活邮件
        return ('注册成功');//提示用户注册成功的视图
      } else {
        return ('注册失败');//提示用户注册失败的视图
      }

   }

   /**
   *  邮件发送的方法
   */
   static public function sendemail($data,$id){
      Mail::send('emails.email' , ['id' => $id,'data' => $data] ,function($m) use($data) {
        $m -> to($data['username'],'亲爱的用户') -> subject('账号注册成功 请激活');
      });
   }
   /**
   *  用户帐号邮件方式激活
   */
   public function getUserstart(Request $request){
      // 拿到用户注册的id和eoken值 对用户帐号信息进行更新
      // 用来将status状态修改为0即解封状态
      $data['status'] = 0;
      // 将token值刷新
      $data['token'] = str_random(50);
      // 执行激活 res是返回的影响行数
      $res = DB::table('user') -> where('id','=',$request -> input('id')) -> where('token','=',$request -> input('token')) -> update($data);
      if ($res > 0) {
        return '帐号激活成功';// 返回帐号激活成功的视图
      } else {
        return '帐号激活失败';// 返回帐号激活失败的视图
      }
   }
   /**
   *  手机注册执行
   */
   public function postInsertphone(Request $request){
      // 注册信息验证
      $this -> validate($request , 
          [
            'phone' => 'required',
            'phonecode' => 'required',
            'password' => 'required',
            'passwordRepeat' => 'required|same:password'
          ],[

            'phone.required' => '请输入手机号',
            'phonecode.required' => '请输入验证码',
            'password.required' => '请输入密码',
            'passwordRepeat.required' => '确认密码不能为空',
            'passwordRepeat.same' => '两次输入的密码不一样'
          ]
        );
      // 验证验证码是否正确
      if (session('phoneCode') != $request -> input('phonecode')) {
        // 将短信验证码注销掉 防止重复使用
        // session() -> forget('phonecode');

        session(['phoneCodeError' => '手机验证码输入错误 请重新获取']);
        // 将错误信息删除
        session() -> forget('phoneCodeError');
        return back();
      }
      // 将短信验证码注销掉 防止重复使用
      session() -> forget('phonecode');

      
      // 保持数据库字段和数组字段对应
      $data['username'] = $request -> input('phone');// 用户帐号及手机号
      $data['password'] = Hash::make($request -> input('password'));
      $data['ctime'] = time();
      $data['token'] = str_random(50);
      $data['status'] = 0;// 手机注册 不需要激活

      // 执行数据库插入 res返回真假值
      $res = DB::table('user') -> insert($data);
      // 对插入进行判断
      if ($res) {
        return '注册成功'; // 需要视图模板
      } else {
        return '注册失败'; // 需要视图模板
      }
      
   }
   /**
   *  手机验证码 方法开始============================
   */
  public function postPhone1(){
      self::Phone();
  }



  static public function Phone(){
    //短信接口地址
    $target = "http://106.ihuyi.cn/webservice/sms.php?method=Submit";
    //获取手机号
    $mobile = $_POST['mobile'];
    //获取验证码
   
    //生成的随机数 
    $mobile_code = mt_rand(1000,9999);// 解决报错 缺少random方法 之后修改成session格式 用来做注册比对

    //将生成的随机数压入session用来做注册的比对
    session(['phoneCode' => $mobile_code]);

    if(empty($mobile)){
      exit('手机号码不能为空');
    }
    

    $post_data = "account=C50253172&password=42013d10344eb86eedbac583a0e79640
    &mobile=".$mobile."&content=".rawurlencode("您的验证码是：".$mobile_code."。请不要把验证码泄露给其他人。");
    //用户名请登录用户中心->验证码、通知短信->帐户及签名设置->APIID
    //查看密码请登录用户中心->验证码、通知短信->帐户及签名设置->APIKEY
    $gets =  self::xml_to_array(self::Post($post_data, $target)); // 调用自己的xml。。。方法

    if($gets['SubmitResult']['code']==2){
      session(['mobile' => $mobile]);
      session(['mobile_code' => $mobile_code]);
    }
    echo $gets['SubmitResult']['msg'];
   }
   /**
   *  解决报错 缺少xml方法  将 xml数据转换为数组格式
   */
   static public function xml_to_array($xml){
      // $arr = [];
      $reg = "/<(\w+)[^>]*>([\\x00-\\xFF]*)<\\/\\1>/";

      if(preg_match_all($reg, $xml, $matches)){

        $count = count($matches[0]);
        
          for($i = 0; $i < $count; $i++){
            $subxml= $matches[2][$i];
              $key = $matches[1][$i];
                if(preg_match( $reg, $subxml )){
                  $arr[$key] = self::xml_to_array( $subxml );// 不要忘记这里对自己的调用
                }else{
                  $arr[$key] = $subxml;
              }
          }
      }
      return $arr;
    }
    /**
    * 解决post方法缺失带来的一串路由代码的问题
    */
    //请求数据到短信接口，检查环境是否 开启 curl init。
   static public function Post($curlPost,$url){
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_HEADER, false);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_NOBODY, true);
        curl_setopt($curl, CURLOPT_POST, true);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $curlPost);
        $return_str = curl_exec($curl);
        curl_close($curl);
        return $return_str;
    }
    /**
    *  手机验证码方法结束 =====================
    */
}
